package LiKou;

import java.util.HashMap;
import java.util.Map;

/**
 * 如果 nums的某个子数组中不同整数的个数恰好为 k，则称 nums的这个连续、不一定不同的子数组为 「好子数组 」。
 */
public class Test9 {
    public static void main(String[] args) {
        int[] nums = {1,2,1,2,3};
        int k = 2;
        System.out.println(subarraysWithKDistinct(nums,k));
    }
    public static int subarraysWithKDistinct(int[] nums, int k) {
        int count=0;
        Map<Integer,Integer> map=new HashMap<>();
        for(int left=0,right=0;right<nums.length;right++){
            if(map.containsKey(nums[right])){
                map.put(nums[right],map.get(nums[right])+1);
            }else{
                map.put(nums[right],1);
            }
            if(map.keySet().size()==k+1){
                while(left<=right){
                    if(map.keySet().size()==(k+1)){
                        if(map.get(nums[left])==1){
                            map.remove(nums[left]);
                            left++;
                            break;
                        }else{
                            map.put(nums[left],map.get(nums[left])-1);
                        }
                        left++;
                    }
                }
            }
            if(map.keySet().size()==k){
                int temp=left;
                while (map.keySet().size()==k && left<=right){
                    System.out.println(map+" "+left+" "+right);
                    count++;
                    if(map.get(nums[left])==1){
                        break;
                    }else{
                        map.put(nums[left],map.get(nums[left])-1);
                    }
                    left++;
                }
                while (map.keySet().size()==k && temp>=0){
                    if(map.containsKey(nums[temp])){
                        count++;
                    }else{
                        break;
                    }
                    temp--;
                }
            }
        }
        return count;
    }
}
